package com.tc.nio;

import com.tc.util.ByteBufferUtil;

import java.nio.ByteBuffer;

/**
 * @Auther: tianchao
 * @Date: 2022/1/30 10:05
 * @Description:
 */
public class TestByteBufferExam {
    /**
     * 网络上有许多条数据发送给服务器，数据之间使用 \n进行分割
     * 但由于某种原因这些数据在接受时，被进行了重新组合，例如原始数据有3条为
     *    Hello,world\n
     *    I am zhangsan\n
     *    How are you?\n
     *    变成了下面两个bytebuffer
     *    Hello,world\nI am zhangsan\nHo
     *    w are you?\n
     *    现在要求编写程序，讲错误的数据复原成按\t分割的数据
     */
    public static void main(String[] args) {
        ByteBuffer source = ByteBuffer.allocate(50);
        source.put("Hello,worldI am zhangsanHo".getBytes());
        System.out.println(source.limit()+"---"+source.capacity());
        ByteBufferUtil.debugAll(source);
        split(source);
        ByteBufferUtil.debugAll(source);
//        source.flip();
//        System.out.println("写模式读："+(char)source.get());
//        source.put("w are you?\n".getBytes());
//        split(source);
//        ByteBufferUtil.debugAll(source);
//        source.compact();
//        ByteBufferUtil.debugAll(source);
    }

    private static void split(ByteBuffer source) {
        source.flip();
        for (int i = 0; i < source.limit(); i++) {
            final byte b = source.get(i);
            if (b == '\n'){
                int length = i + 1 - source.position();
                ByteBuffer target = ByteBuffer.allocate(length);
                //向source读  向target写
                for (int j = 0; j < length; j++) {
                    target.put(source.get());
                }
                ByteBufferUtil.debugAll(target);
            }
        }
        // 写 不能从头写 source.clear()；不对
        source.compact();
    }
}
